class ConvenioController < ApplicationController
  # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
  verify :method => :post, :only => [ :destroy, :create, :update ],
    :redirect_to => { :action => :list }

  def index
    if perfil_asistente?
      asistente
      render :action => 'list'
    else
      list
      render :action => 'list'
    end

  end

  # mostrar solo los convenios vigentes de los convenios de consumo del usuario firmado
  def list
    ejecutivo = Ejecutivo.find(session[:user])
    these_children = ejecutivo.all_active_children
    
    if perfil_nacional?
      @convenios = Convenio.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE,
        :order => 'id', :conditions => 'status_id = 1 AND fecha_termino < GETDATE()'
      @convenios_recientes = Convenio.recientes(Ejecutivo.find(session[:user]))
      @convenios_vencidos = Convenio.por_vencer(Ejecutivo.find(session[:user]))
      @total_count = Convenio.count
    else
      conditions = ['(status_id=1) AND (fecha_termino >= GETDATE()) AND (ejecutivo_id IN (:these_children))',
        {:these_children => these_children}
      ]
      @convenios = Convenio.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE,
        :conditions => conditions, :order => 'id'
      @total_count = Convenio.count(:conditions => conditions)
      @convenios_recientes = Convenio.recientes(Ejecutivo.find(session[:user]))
      @convenios_vencidos = Convenio.por_vencer(Ejecutivo.find(session[:user]))
    end

  end

  def show
    @convenio = Convenio.find(params[:id])
    @participante = if @convenio.tipo_participante == Convenio::CENTRO_CONSUMO
      Centro.find(@convenio.participante_id)
    elsif @convenio.tipo_participante == Convenio::CORPORATIVO
      Corporativo.find(@convenio.participante_id)
    end

    @objetivos_mensuales = String.new
    @convenio.bonificaciones.each do |objetivo|
      @objetivos_mensuales << "'#{Familia.find(objetivo.marca_id).nombre}':'#{objetivo.objetivo_mensual} cajas 9lt.',"
    end
  end

  def new
    @convenio = Convenio.new
    @tipo = params[:t].to_i
    @unidades = unidades_por_ejecutivo(session[:user], @tipo)

    @marcas = Familia.cuervo
    @convenio.bonificaciones << Bonificacion.new
    
    @otros_compromisos_cuervo = Array.new

    @otros_compromisos_cliente = Array.new

  end

  def create
    @convenio = Convenio.new(params[:convenio])
    @tipo = params[:t].to_i

    @convenio.tipo_participante = @tipo
    @convenio.ejecutivo_id = session[:user]
    agregar_compromisos(params[:compromisos_cuervo], Compromiso::CASA_CUERVO)
    agregar_compromisos(params[:compromisos_cliente], Compromiso::CLIENTE)

    agregar_otros_compromisos(params[:otros_compromisos_cuervo], Compromiso::CASA_CUERVO) unless params[:otros_compromisos_cuervo].nil? || params[:otros_compromisos_cuervo].size == 0
    agregar_otros_compromisos(params[:otros_compromisos_cliente], Compromiso::CLIENTE) unless params[:otros_compromisos_cliente].nil? || params[:otros_compromisos_cliente].size == 0

    agregar_compromisos_efectivo(params[:apoyo_efectivo], Compromiso::CASA_CUERVO, "Apoyo en efectivo")
    agregar_compromisos_efectivo(params[:pago_efectivo], Compromiso::CASA_CUERVO, "Pago en efectivo")

    # agregar marcas de cocteler�a para exhibici�n
    # aqui todav�a no existen las bonificaciones, solo las bonificaciones_attributes, duh!
    #    agregar_marcas_exhibicion(params[:convenio[:bonificaciones_attributes]], "Manejar como productos fijos de cocteleria: |marcas|") if @convenio.bonificaciones.size > 0

    # agregar marcas para exhibici�n especial permanente
    #    agregar_marcas_exhibicion(@convenio.bonificaciones,"Exhibicion especial permanente de Botellas de |marcas| en Contrabarras y/o lugares acordados para su exhibicion.") if @convenio.bonificaciones.size > 0
    
    if @convenio.save
      flash[:notice] = "El Convenio se ha enviado para autorización."
      redirect_to :action => 'list'

    else
      @unidades = unidades_por_ejecutivo(session[:user], @tipo)
      @marcas = Familia.cuervo
      @otros_compromisos_cuervo = Array.new
      @otros_compromisos_cliente = Array.new
      render :action => 'new'
    end

  end

  def agregar_compromisos(compromisos, responsable)
    compromisos.each do |k,v|
      @convenio.agregar_compromiso(Compromiso::DESCRIPCION_COMPROMISOS[k], responsable) if v == "1"
    end

  end

  def agregar_compromisos_efectivo(compromisos, responsable, concepto)
    if compromisos["bolsa"] == "1"
      logger.debug compromisos["concepto_bolsa"]
      logger.debug compromisos["importe_bolsa"]
      descripcion = "#{concepto} aplicable a la bolsa por concepto de %s" % compromisos["concepto_bolsa"]
      @convenio.agregar_compromiso(descripcion, responsable, compromisos["importe_bolsa"])
    end

    if compromisos["patrocinio"] == "1"
      logger.debug compromisos["concepto_bolsa"]
      logger.debug compromisos["importe_bolsa"]
      descripcion = "#{concepto} aplicable como patrocinio por concepto de %s" % compromisos["concepto_patrocinio"]
      @convenio.agregar_compromiso(descripcion, responsable, compromisos["importe_patrocinio"])
    end

  end

  def unidades_por_ejecutivo(usuario, tipo_participante)
    ejecutivo = Ejecutivo.find(usuario)
    unidades = case tipo_participante
    when Convenio::CENTRO_CONSUMO then ejecutivo.centros 
    when Convenio::CORPORATIVO    then ejecutivo.corporativos 
    end

  end

  def agregar_marcas_exhibicion(bonificaciones, compromiso)
    logger.debug @convenio.bonificaciones.size
    marcas = Array.new
    @convenio.bonificaciones.each do |b|
      marcas << Marca.find(b.marca_id)
    end

    compromiso["|marcas|"] = marcas.uniq.join(',')
    logger.debug compromiso
    @convenio.agregar_compromiso(compromiso, Compromiso::CLIENTE)

  end

  def agregar_otros_compromisos(compromisos, responsable)
    compromisos.each do |c|
      logger.debug c.to_s
      @convenio.agregar_compromiso(c['descripcion'], responsable, c['importe'])
    end

  end
  
  def txt_export
    conditions = {}
    ejecutivo = Ejecutivo.find(session[:user])
    these_children = find_children_ids(ejecutivo)
    
    if perfil_nacional?
      @convenios = Convenio.find(:all)
    else
      conditions[:ejecutivo_id] = these_children
      @convenios = Convenio.find(:all, :conditions => conditions)
      
    end
    
    report = StringIO.new
    CSV::Writer.generate(report, ',') do |csv|
      csv << ["Ejecutivo", "Consecutivo","Fecha Inicio", "Fecha Termino", "Centro de Consumo",
        "Destino", "Marca", "Porcentaje", "Objetivo Mensual"
      ]
      @convenios.each do |convenio|
        if convenio.tipo_participante == Convenio::CENTRO_CONSUMO
          participante = Centro.find(convenio.participante_id)
        elsif convenio.tipo_participante == Convenio::CORPORATIVO
          participante =Corporativo.find(convenio.participante_id)
        end
          
        convenio.bonificaciones.each do |b|
          csv << [Ejecutivo.find(convenio.ejecutivo_id).nombre_completo, convenio.consecutivo, convenio.fecha_inicio, convenio.fecha_termino, participante.nombre_comercial,
            Bonificacion::DESTINO.invert[b.destino], Familia.find(b.marca_id).nombre, b.porcentaje, b.objetivo_mensual
          ]
        end
      end
    end
    
    report.rewind
    send_data(report.read,
      :type => 'text/csv; charset=iso-8859-1; header=present',
      :filename => 'convenios.csv')
    
  end
  
  def deshabilitar
    convenio = Convenio.find(params[:id])
    
    # recortar vigencia
    convenio.fecha_termino = Time.now
    
    # poner status_id a 0
    convenio.status_id = 0
    
    if convenio.save
      flash[:notice] = "Convenio deshabilitado..."
      
    end
    
    redirect_to :action => "index"
  end
  
  def imprimir
    @convenio = Convenio.find(params[:id])
    @participante = if @convenio.tipo_participante == Convenio::CENTRO_CONSUMO
      Centro.find(@convenio.participante_id)
    elsif @convenio.tipo_participante == Convenio::CORPORATIVO
      Corporativo.find(@convenio.participante_id)
    end
    
    duracion = @convenio.fecha_termino - @convenio.fecha_inicio
    @duracion = (duracion/60/60/24/30).to_i

    conditions = [
      "(destino = :destino_id) AND (porcentaje > 0)",
      {:destino_id => Bonificacion::ESPECIE}
    ]
    @bonificaciones_especie = @convenio.bonificaciones.find(:all, :conditions => conditions)
    @texto_bonificaciones_especie = String.new
    @bonificaciones_especie.each do |b_e|
      @texto_bonificaciones_especie << ",#{b_e.porcentaje}% en la marca '#{Familia.find(b_e.marca_id).nombre}'"
    end unless @bonificaciones_especie.blank?
    
    conditions = [
      "(destino = :destino_id) AND (porcentaje > 0)",
      {:destino_id => Bonificacion::BOLSA}
    ]
    @bonificaciones_bolsa = @convenio.bonificaciones.find(:all, :conditions => conditions)
    @texto_bonificaciones_bolsa = String.new
    @bonificaciones_bolsa.each do |b_b|
      @texto_bonificaciones_bolsa << ",#{b_b.porcentaje}% en la marca '#{Familia.find(b_b.marca_id).nombre}'"
    end unless @bonificaciones_bolsa.blank?
    
    @compromisos_cuervo = @convenio.compromisos.find(:all, :conditions => {:responsable => Compromiso::CASA_CUERVO})
    
    @compromisos_cliente = @convenio.compromisos.find(:all, :conditions => {:responsable => Compromiso::CLIENTE})
    
    @objetivos_mensuales = String.new
    @convenio.bonificaciones.each do |objetivo|
      @objetivos_mensuales << ",'#{Familia.find(objetivo.marca_id).nombre}':'#{objetivo.objetivo_mensual} cajas 9lt.'" if objetivo.porcentaje > 0
    end
    
    render :action => "imprimir", :layout => false
  end
  
  def authorization
    @convenio = Convenio.find(params[:id])
    @participante = if @convenio.tipo_participante == Convenio::CENTRO_CONSUMO
      Centro.find(@convenio.participante_id)
    elsif @convenio.tipo_participante == Convenio::CORPORATIVO
      Corporativo.find(@convenio.participante_id)
    end
    @status = Catalogo.find_by_nombre('Status Items').entradas_catalogo

  end
  
  def authorize
    @convenio = Convenio.find(params[:id])
    
    if @convenio.update_attributes(params[:convenio])
      flash[:notice] = "Convenio autorizado..."
      redirect_to :controller => "autorizar", :action => "index"
    else
      render :action => "authorization", :id => @convenio
    end
  end

  def search
    unless params[:search].blank?
      conditions = ["concatenado LIKE ?",
        "%#{params[:search]}%"] unless params[:search].nil?
      @convenios = BusquedaConvenio.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE,
        :order => 'id',
        :conditions => conditions
      #      :conditions => Centro.conditions_by_like(params[:search])
      logger.info "Resultado de la busqueda: #{@convenios.size} convenios encontrados"
    else
      list
      
      render :action => 'list', :layout => true
    end
    
  end

  def asistente
    usuario_actual = Ejecutivo.find(session[:user])
    jefe_inmediato = Ejecutivo.find(usuario_actual.reporta_a_id)
    these_children = find_children_ids(jefe_inmediato)
    
    conditions = {}
    conditions[:ejecutivo_id] = these_children
    conditions[:status_id] = 1
    
    @convenios = Convenio.paginate :page => params[:page], :per_page => DEFAULT_PER_PAGE, :order => 'id', :conditions => conditions
    @convenios_count = Centro.count(:conditions => conditions)
    @convenios_recientes = Convenio.recientes(Ejecutivo.find(session[:user]))
    @convenios_vencidos = Convenio.por_vencer(Ejecutivo.find(session[:user]))
    
  end
  
  def imprimir_pdf
    convenio_id = params[:id]
    
    pdf = ConvenioPdf.new(convenio_id)
    pdf_name = "convenio-#{convenio_id}.pdf"
    
    send_data pdf.imprimir, :filename => pdf_name, :type => 'application/pdf'
  end
  
  def edit
    @convenio = Convenio.find(params[:id])
    @participante = if @convenio.tipo_participante == Convenio::CENTRO_CONSUMO
      Centro.find(@convenio.participante_id)
    elsif @convenio.tipo_participante == Convenio::CORPORATIVO
      Corporativo.find(@convenio.participante_id)
    end
    @marcas = Familia.cuervo
    
  end
  
  def update
    @convenio = Convenio.find(params[:id])

    if @convenio.update_attributes(params[:convenio])
      flash[:notice] = "Convenio actualizado."
      redirect_to :action => "index"
    else
      @participante = if @convenio.tipo_participante == Convenio::CENTRO_CONSUMO
        Centro.find(@convenio.participante_id)
      elsif @convenio.tipo_participante == Convenio::CORPORATIVO
        Corporativo.find(@convenio.participante_id)
      end
      @marcas = Familia.cuervo
      
      render :action => 'edit', :id => @convenio
    
    end
    
  end
end
